package com.controladores.controlvehicular;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.ArrayList;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.controladores.controlvehicular.R;
import com.controladores.controlvehicular.basededatos.GestorBaseDatos;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Typeface;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/**
 * Clase de la interfaz de inicio de Sesión
 * @author Luis Soto <lsantoniosoto@gmail.com>
 * @author Mariuxi Salinas <mariuxidelcisne@gmail.com>
 * @version 1.0, 11/04/2014
 */
public class InicioSesion extends SherlockFragmentActivity implements
		OnClickListener {
	protected TextView etiquetaFuenteIU;
	protected TextView fuenteIC;
	protected TextView fuenteSM;
	protected TextView fuenteER;
	private EditText cajaContrasena, cajaUsuario;
	Socket sk;
	DataInputStream entrada;
	DataOutputStream salida;
	private String[] datosExtraidos;
	private boolean estadoConexion;
	private boolean estadoAccesoInternet;
	private String informacion;
	private String nombreUsuarioServ;
	private String user, password;
	private String claveEncriptacion = "SI@P/ml*vc#";
	private ProgressDialog dialogCircle;
	private String[] zonas;
	private String nombreZona1;
	private String horaInicio1;
	private String horaFin1;
	private String numeroEspacios11;
	private String idSubcalle11;
	
	private String orientacion11;
	private String callePrincipal11;
	private String calleSecundaria111;
	private String calleSecundaria211;

	private String numeroEspacios21;
	private String idSubcalle21;
	private String orientacion21;
	private String callePrincipal21;
	private String calleSecundaria121;
	private String calleSecundaria221;

	private String numeroEspacios31;
	private String idSubcalle31;
	private String orientacion31;
	private String callePrincipal31;
	private String calleSecundaria131;
	private String calleSecundaria231;

	private String numeroEspacios41;
	private String idSubcalle41;
	private String orientacion41;
	private String callePrincipal41;
	private String calleSecundaria141;
	private String calleSecundaria241;

	private String numeroEspacios51;
	private String idSubcalle51;
	private String orientacion51;
	private String callePrincipal51;
	private String calleSecundaria151;
	private String calleSecundaria251;
	
	private String numeroEspacios12;
	private String nombreZona2;
	private String horaInicio2;
	private String horaFin2;
	private String idSubcalle12;
	private String orientacion12;
	private String callePrincipal12;
	private String calleSecundaria112;
	private String calleSecundaria212;

	private String numeroEspacios22;
	private String idSubcalle22;
	private String orientacion22;
	private String callePrincipal22;
	private String calleSecundaria122;
	private String calleSecundaria222;

	private String numeroEspacios32;
	private String idSubcalle32;
	private String orientacion32;
	private String callePrincipal32;
	private String calleSecundaria132;
	private String calleSecundaria232;

	private String numeroEspacios42;
	private String idSubcalle42;
	private String orientacion42;
	private String callePrincipal42;
	private String calleSecundaria142;
	private String calleSecundaria242;

	private String numeroEspacios52;
	private String idSubcalle52;
	private String orientacion52;
	private String callePrincipal52;
	private String calleSecundaria152;
	private String calleSecundaria252;

	private String numeroEspacios13;
	private String nombreZona3;
	private String horaInicio3;
	private String horaFin3;
	private String idSubcalle13;
	private String orientacion13;
	private String callePrincipal13;
	private String calleSecundaria113;
	private String calleSecundaria213;

	private String numeroEspacios23;
	private String idSubcalle23;
	private String orientacion23;
	private String callePrincipal23;
	private String calleSecundaria123;
	private String calleSecundaria223;

	private String numeroEspacios33;
	private String idSubcalle33;
	private String orientacion33;
	private String callePrincipal33;
	private String calleSecundaria133;
	private String calleSecundaria233;

	private String numeroEspacios43;
	private String idSubcalle43;
	private String orientacion43;
	private String callePrincipal43;
	private String calleSecundaria143;
	private String calleSecundaria243;

	private String numeroEspacios53;
	private String idSubcalle53;
	private String orientacion53;
	private String callePrincipal53;
	private String calleSecundaria153;
	private String calleSecundaria253;

	private String numeroEspacios14;
	private String nombreZona4;
	private String horaInicio4;
	private String horaFin4;
	private String idSubcalle14;
	private String orientacion14;
	private String callePrincipal14;
	private String calleSecundaria114;
	private String calleSecundaria214;

	private String numeroEspacios24;
	private String idSubcalle24;
	private String orientacion24;
	private String callePrincipal24;
	private String calleSecundaria124;
	private String calleSecundaria224;

	private String numeroEspacios34;
	private String idSubcalle34;
	private String orientacion34;
	private String callePrincipal34;
	private String calleSecundaria134;
	private String calleSecundaria234;

	private String numeroEspacios44;
	private String idSubcalle44;
	private String orientacion44;
	private String callePrincipal44;
	private String calleSecundaria144;
	private String calleSecundaria244;

	private String numeroEspacios54;
	private String idSubcalle54;
	private String orientacion54;
	private String callePrincipal54;
	private String calleSecundaria154;
	private String calleSecundaria254;

	private String idTipoMultaServidor;
	private String razonMulta;
	private String desdeTiempoMulta;
	private String hastaTiempoMulta;
	private String montoMulta;
	private int tiempo;
	private int puerto = 0;
	private String ip = "";
	public static Activity ma;
	private Button botonInicioSesion;
	private String mac="";
	String msg = null;
	ProgressDialog progressDoalog;
	GestorBaseDatos miBBDDHelper;

	public DataInputStream getEntrada() {
		return entrada;
	}

	public void setEntrada(DataInputStream entrada) {
		this.entrada = entrada;
	}

	public DataOutputStream getSalida() {
		return salida;
	}

	public void setSalida(DataOutputStream salida) {
		this.salida = salida;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_inicio_sesion);
		inicializarComponentes();
		inicializarAccionesDeComponentes();
	}
	/**
	 * Inicializa los componentes para la interfaz
	 */
	private void inicializarComponentes() {
		cajaUsuario = (EditText) findViewById(R.id.etUsuario);
		cajaContrasena = (EditText) findViewById(R.id.etContasena);
		estadoConexion = false;
		botonInicioSesion = (Button) findViewById(R.id.btnLogin);
		etiquetaFuenteIU = (TextView) findViewById(R.id.tvNomPrograma);
		Typeface tipofuente = Typeface.createFromAsset(getAssets(),
				"gloriahallelujah.ttf");
		etiquetaFuenteIU.setTypeface(tipofuente);
	}
	/**
	 * Inicializa eventos de los componentes
	 */
	private void inicializarAccionesDeComponentes() {
		botonInicioSesion.setOnClickListener(this);

	}
	public  String obtenerMac() {
		WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
		WifiInfo wifiInfo = wifiManager.getConnectionInfo();
		String direcionMac = wifiInfo.getMacAddress();
		return direcionMac;
	} 
	public void inicializacion() {
		GestorBaseDatos manejador = new GestorBaseDatos(InicioSesion.this);
		user = cajaUsuario.getText().toString().trim();
		password = cajaContrasena.getText().toString().trim();
		try {
			manejador.abrirBaseDatos();
			mac=manejador.obtenerMac();
			manejador.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
		System.out.println(mac);
		String informacionRegistro = "##;" + "001;" + user + ";" + password
				+";"+mac+";**";
				informacion = encriptacion(informacionRegistro, claveEncriptacion);
		dialogEspera();
		estadoConexion = conectar();
		Main main= new Main();
		
		estadoAccesoInternet= main.respuestaEnLinea();
		if (estadoConexion == true&&estadoAccesoInternet==true) {
			Toast.makeText(getBaseContext(), "Conexión establecida",
					Toast.LENGTH_LONG).show();
			enviarMensaje(informacion);
			String informacionRecibida = desencriptacion(recibirMensaje(),
					claveEncriptacion);
			String datosRecibidos = quitarEspaciosTrama(informacionRecibida);
			System.out.println(datosRecibidos);
			datosExtraidos = descomposeTrama(datosRecibidos, ";");
			if (datosExtraidos[0].compareTo("##") == 0
					&& datosExtraidos[1].compareTo("002") == 0) {
				if (datosExtraidos[2].compareTo("1") == 0) {
					nombreUsuarioServ = datosExtraidos[3];
					boolean bienHecho = false;
					GestorBaseDatos sesion = new GestorBaseDatos(
							InicioSesion.this);
					sesion.abrirBaseDatos();
					String estadoSesion = "1";
					bienHecho = sesion.guardarDatosUsuario(user, password,
							estadoSesion);
					sesion.close();

					try {

						// Coordenadas guardar

						String zonasS = datosExtraidos[4];
						String zonasSP = zonasS.substring(0,
								zonasS.length() - 1);
						// System.out.println(zonasSP);
						String zonasAuxiliar[] = descomposeT(zonasSP, "'");
						zonas = ordenarZonas(zonasAuxiliar);

						// String zonasT;
						String[] elementosCalles;
						String idSubcalleCoordenadas;
						String punto1;
						String punto2;
						String punto3;
						String punto4;
						for (int i = 0; i < zonas.length; i++) {
							String zonaQuitarCaracter = zonas[i].substring(1);
							String elementoZona[] = zonaQuitarCaracter
									.split("_,");
							String nombreZona = elementoZona[0];
							String horaInicio = elementoZona[1];
							String horaFin = elementoZona[2];
							for (int j = 5; j < elementoZona.length; j++) {
								String callePosicion = elementoZona[j];
								elementosCalles = callePosicion.split("/");
								idSubcalleCoordenadas = elementosCalles[0];
								punto1 = elementosCalles[6];
								punto2 = elementosCalles[7];
								punto3 = elementosCalles[8];
								punto4 = elementosCalles[9];
								System.out
										.println("puntos si se estan extrayendo: "
												+ punto1
												+ " "
												+ punto2
												+ " "
												+ punto3 + " " + punto4);
								// Aqui persistencia en tabla nueva de
								// puntos
								manejador.abrirBaseDatos();
								bienHecho = manejador
										.insertarCoordenadasSubCalle(nombreZona,
												idSubcalleCoordenadas,
												horaInicio, horaFin, punto1,
												punto2, punto3, punto4);
								manejador.close();
							}
						}
						String zona1S = zonas[0];
						String zona1SP = zona1S.substring(1,
								zona1S.length() - 1);
						String aZona1[] = descomposeT(zona1SP, "_,");
						nombreZona1 = aZona1[0];
						horaInicio1 = aZona1[1];
						horaFin1 = aZona1[2];
						String horaInicioReceso = aZona1[3];
						String horaFinReceso = aZona1[4];
						System.out.println(nombreZona1 + " " + horaInicio1
								+ " " + horaFin1);
						System.out
								.println("inicio receso  " + horaInicioReceso);
						System.out.println("fin receso  " + horaFinReceso);
						String subcalles11S = aZona1[5];
						String aSubcalles11[] = descomposeT(subcalles11S, "/");
						idSubcalle11 = aSubcalles11[0];
						orientacion11 = aSubcalles11[1];
						numeroEspacios11=aSubcalles11[2];
						callePrincipal11 = aSubcalles11[3];
						calleSecundaria111 = aSubcalles11[4];
						calleSecundaria211 = aSubcalles11[5];
						manejador.abrirBaseDatos();
						int num = aZona1.length - 5;
						bienHecho = manejador.insertarAsignacionZona(
								nombreUsuarioServ, nombreZona1, idSubcalle11,
								callePrincipal11, calleSecundaria111,
								calleSecundaria211, num, horaInicio1, horaFin1,
								orientacion11, horaInicioReceso, horaFinReceso,numeroEspacios11);
						manejador.close();
						long id = 1;
						if (aZona1.length >= 7) {
							String subcalles21S = aZona1[6];
							String aSubcalles21[] = descomposeT(subcalles21S,
									"/");
							idSubcalle21 = aSubcalles21[0];
							orientacion21 = aSubcalles21[1];
							numeroEspacios21=aSubcalles21[2];
							callePrincipal21 = aSubcalles21[3];
							calleSecundaria121 = aSubcalles21[4];
							calleSecundaria221 = aSubcalles21[5];
							System.err.println("por ver"+idSubcalle21 + callePrincipal21
									+ calleSecundaria121 + calleSecundaria221);
							manejador.abrirBaseDatos();
							bienHecho = manejador
									.insertarAsignacionZonaSubcalle2(id,
											idSubcalle21, callePrincipal21,
											calleSecundaria121,
											calleSecundaria221, orientacion21,numeroEspacios21);
							manejador.close();
							if (aZona1.length >= 8) {
								String subcalles31S = aZona1[7];
								String aSubcalles31[] = descomposeT(
										subcalles31S, "/");
								idSubcalle31 = aSubcalles31[0];
								orientacion31 = aSubcalles31[1];
								numeroEspacios31=aSubcalles31[2];
								callePrincipal31 = aSubcalles31[3];
								calleSecundaria131 = aSubcalles31[4];
								calleSecundaria231 = aSubcalles31[5];
								manejador.abrirBaseDatos();
								bienHecho = manejador
										.insertarAsignacionZonaSubcalle3(id,
												idSubcalle31, callePrincipal31,
												calleSecundaria131,
												calleSecundaria231,
												orientacion31,numeroEspacios31);
								manejador.close();
								if (aZona1.length >= 9) {
									String subcalles41S = aZona1[8];
									String aSubcalles41[] = descomposeT(
											subcalles41S, "/");
									idSubcalle41 = aSubcalles41[0];
									orientacion41 = aSubcalles41[1];
									numeroEspacios41=aSubcalles41[2];
									callePrincipal41 = aSubcalles41[3];
									calleSecundaria141 = aSubcalles41[4];
									calleSecundaria241 = aSubcalles41[5];
									manejador.abrirBaseDatos();
									bienHecho = manejador
											.insertarAsignacionZonaSubcalle4(id,
													idSubcalle41,
													callePrincipal41,
													calleSecundaria141,
													calleSecundaria241,
													orientacion41,numeroEspacios41);
									manejador.close();
									// subcalle 4 de la ZonaTrabajo1 1 persistir
									// desde aqui..

									if (aZona1.length > 9) {
										String subcalles51S = aZona1[9];
										String aSubcalles51[] = descomposeT(
												subcalles51S, "/");
										idSubcalle51 = aSubcalles51[0];
										orientacion51 = aSubcalles51[1];
										numeroEspacios51=aSubcalles51[2];
										callePrincipal51 = aSubcalles51[3];
										calleSecundaria151 = aSubcalles51[4];
										calleSecundaria251 = aSubcalles51[5];
										manejador.abrirBaseDatos();
										bienHecho = manejador
												.insertarAsignacionZonaSubcalle5(
														id, idSubcalle51,
														callePrincipal51,
														calleSecundaria151,
														calleSecundaria251,
														orientacion51,numeroEspacios51);
										manejador.close();
										// subcalle 5 de la ZonaTrabajo1 1
										// persistir
									}

								}
							}
						}
						// System.out.println("tamanozonasordenadas"+zonas.length);
						if (zonas.length >= 2) {
							String zona2S = zonas[1];
							String zona2SP = zona2S.substring(1,
									zona2S.length() - 1);
							String aZona2[] = descomposeT(zona2SP, "_,");
							nombreZona2 = aZona2[0];
							horaInicio2 = aZona2[1];
							horaFin2 = aZona2[2];
							String horaInicioReceso2 = aZona2[3];
							String horaFinReceso2 = aZona2[4];
							System.out.println(nombreZona2 + " " + horaInicio2
									+ " " + horaFin2);
							// Comparar hora inicio y fin de las dos
							// subzonas

							String subcalles12S = aZona2[5];
							String aSubcalles12[] = descomposeT(subcalles12S,
									"/");
							idSubcalle12 = aSubcalles12[0];
							orientacion12 = aSubcalles12[1];
							numeroEspacios12=aSubcalles12[2];
							callePrincipal12 = aSubcalles12[3];
							calleSecundaria112 = aSubcalles12[4];
							calleSecundaria212 = aSubcalles12[5];
							manejador.abrirBaseDatos();
							int num2 = aZona2.length - 5;
							bienHecho = manejador.insertarAsignacionZona2(
									// /ver otra zona
									nombreUsuarioServ, nombreZona2,
									idSubcalle12, callePrincipal12,
									calleSecundaria112, calleSecundaria212,
									num2, horaInicio2, horaFin2, orientacion12,
									horaInicioReceso2, horaFinReceso2,numeroEspacios12);
							manejador.close();

							if (aZona2.length >= 7) {
								String subcalles22S = aZona2[6];
								String aSubcalles22[] = descomposeT(
										subcalles22S, "/");
								idSubcalle22 = aSubcalles22[0];
								orientacion22 = aSubcalles22[1];
								numeroEspacios22=aSubcalles22[2];
								callePrincipal22 = aSubcalles22[3];
								calleSecundaria122 = aSubcalles22[4];
								calleSecundaria222 = aSubcalles22[5];
								manejador.abrirBaseDatos();

								bienHecho = manejador
										.insertarAsignacionZonaSubcalle22(id,
												idSubcalle22, callePrincipal22,
												calleSecundaria122,
												calleSecundaria222,
												orientacion22,numeroEspacios22);
								manejador.close();
								if (aZona2.length >= 8) {
									String subcalles32S = aZona2[7];
									String aSubcalles32[] = descomposeT(
											subcalles32S, "/");
									idSubcalle32 = aSubcalles32[0];
									orientacion32 = aSubcalles32[1];
									numeroEspacios32=aSubcalles32[2];
									callePrincipal32 = aSubcalles32[3];
									calleSecundaria132 = aSubcalles32[4];
									calleSecundaria232 = aSubcalles32[5];
									manejador.abrirBaseDatos();

									bienHecho = manejador
											.insertarAsignacionZonaSubcalle23(
													id, idSubcalle32,
													callePrincipal32,
													calleSecundaria132,
													calleSecundaria232,
													orientacion32,numeroEspacios32);
									manejador.close();
									if (aZona2.length >= 9) {
										String subcalles42S = aZona2[8];
										String aSubcalles42[] = descomposeT(
												subcalles42S, "/");
										idSubcalle42 = aSubcalles42[0];
										orientacion42 = aSubcalles42[1];
										numeroEspacios42=aSubcalles42[2];
										callePrincipal42 = aSubcalles42[3];
										calleSecundaria142 = aSubcalles42[4];
										calleSecundaria242 = aSubcalles42[5];
										// subcalle 4 de la ZonaTrabajo1 2
										// persistir
										manejador.abrirBaseDatos();
										bienHecho = manejador
												.insertarAsignacionZonaSubcalle24(
														id, idSubcalle42,
														callePrincipal42,
														calleSecundaria142,
														calleSecundaria242,
														orientacion42,numeroEspacios42);
										manejador.close();

										if (aZona2.length > 9) {
											String subcalles52S = aZona2[9];
											String aSubcalles52[] = descomposeT(
													subcalles52S, "/");
											idSubcalle52 = aSubcalles52[0];
											orientacion52 = aSubcalles52[1];
											numeroEspacios52=aSubcalles52[2];
											callePrincipal52 = aSubcalles52[3];
											calleSecundaria152 = aSubcalles52[4];
											calleSecundaria252 = aSubcalles52[5];
											// subcalle 5 de la ZonaTrabajo1 2
											// persistir
											manejador.abrirBaseDatos();
											bienHecho = manejador
													.insertarAsignacionZonaSubcalle25(
															id, idSubcalle52,
															callePrincipal52,
															calleSecundaria152,
															calleSecundaria252,
															orientacion52,numeroEspacios52);
											manejador.close();
										}

									}
								}
							}
							if (zonas.length >= 3) {
								String zona3S = zonas[2];
								String zona3SP = zona3S.substring(1,
										zona3S.length() - 1);
								String aZona3[] = descomposeT(zona3SP, "_,");
								nombreZona3 = aZona3[0];
								horaInicio3 = aZona3[1];
								horaFin3 = aZona3[2];
								String horaInicioReceso3 = aZona3[3];
								String horaFinReceso3 = aZona3[4];
								String subcalles13S = aZona3[5];
								String aSubcalles13[] = descomposeT(
										subcalles13S, "/");
								idSubcalle13 = aSubcalles13[0];
								orientacion13 = aSubcalles13[1];
								numeroEspacios13=aSubcalles13[2];
								callePrincipal13 = aSubcalles13[3];
								calleSecundaria113 = aSubcalles13[4];
								calleSecundaria213 = aSubcalles13[5];
								manejador.abrirBaseDatos();
								int num3 = aZona3.length - 5;
								bienHecho = manejador.insertarAsignacionZona3(
										// ver otra zona 3
										nombreUsuarioServ, nombreZona3,
										idSubcalle13, callePrincipal13,
										calleSecundaria113, calleSecundaria213,
										num3, horaInicio3, horaFin3,
										orientacion13, horaInicioReceso3,
										horaFinReceso3,numeroEspacios13);
								manejador.close();
								if (aZona3.length >= 7) {
									String subcalles23S = aZona3[6];
									String aSubcalles23[] = descomposeT(
											subcalles23S, "/");
									idSubcalle23 = aSubcalles23[0];
									orientacion23 = aSubcalles23[1];
									numeroEspacios23=aSubcalles23[2];
									callePrincipal23 = aSubcalles23[3];
									calleSecundaria123 = aSubcalles23[4];
									calleSecundaria223 = aSubcalles23[5];
									manejador.abrirBaseDatos();
									bienHecho = manejador
											.insertarAsignacionZonaSubcalle32(
													id, idSubcalle23,
													callePrincipal23,
													calleSecundaria123,
													calleSecundaria223,
													orientacion23,numeroEspacios23);
									manejador.close();
									if (aZona3.length >= 8) {
										String subcalles33S = aZona3[7];
										String aSubcalles33[] = descomposeT(
												subcalles33S, "/");
										idSubcalle33 = aSubcalles33[0];
										orientacion33 = aSubcalles33[1];
										numeroEspacios33=aSubcalles33[2];
										callePrincipal33 = aSubcalles33[3];
										calleSecundaria133 = aSubcalles33[4];
										calleSecundaria233 = aSubcalles33[5];
										manejador.abrirBaseDatos();
										bienHecho = manejador
												.insertarAsignacionZonaSubcalle33(
														id, idSubcalle33,
														callePrincipal33,
														calleSecundaria133,
														calleSecundaria233,
														orientacion33,numeroEspacios33);
										System.out.println("id dubcallle33"
												+ idSubcalle33
												+ "calle principal "
												+ callePrincipal33
												+ "calle secundaria 1"
												+ calleSecundaria133
												+ "calle secundaria 2 "
												+ calleSecundaria233);
										manejador.close();
										if (aZona3.length >= 9) {
											String subcalles43S = aZona3[8];
											String aSubcalles43[] = descomposeT(
													subcalles43S, "/");
											idSubcalle43 = aSubcalles43[0];
											orientacion43 = aSubcalles43[1];
											numeroEspacios43=aSubcalles43[2];
											callePrincipal43 = aSubcalles43[3];
											calleSecundaria143 = aSubcalles43[4];
											calleSecundaria243 = aSubcalles43[5];
											// subcalle 4 de la ZonaTrabajo1 3
											// persistir
											manejador.abrirBaseDatos();
											bienHecho = manejador
													.insertarAsignacionZonaSubcalle34(
															id, idSubcalle43,
															callePrincipal43,
															calleSecundaria143,
															calleSecundaria243,
															orientacion43,numeroEspacios43);
											manejador.close();
											if (aZona3.length > 9) {
												String subcalles53S = aZona3[9];
												String aSubcalles53[] = descomposeT(
														subcalles53S, "/");
												idSubcalle53 = aSubcalles53[0];
												orientacion53 = aSubcalles53[1];
												numeroEspacios53=aSubcalles53[2];
												callePrincipal53 = aSubcalles53[3];
												calleSecundaria153 = aSubcalles53[4];
												calleSecundaria253 = aSubcalles53[5];
												// subcalle 5 de la ZonaTrabajo1
												// 3 persistir
												manejador.abrirBaseDatos();
												bienHecho = manejador
														.insertarAsignacionZonaSubcalle35(
																id,
																idSubcalle53,
																callePrincipal53,
																calleSecundaria153,
																calleSecundaria253,
																orientacion53,numeroEspacios53);
												manejador.close();
											}
										}
									}
								}
								if (zonas.length > 3) {
									String zona4S = zonas[3];
									String zona4SP = zona4S.substring(1,
											zona4S.length() - 1);
									String aZona4[] = descomposeT(zona4SP, "_,");
									nombreZona4 = aZona4[0];
									horaInicio4 = aZona4[1];
									horaFin4 = aZona4[2];
									String horaInicioReceso4 = aZona4[3];
									String horaFinReceso4 = aZona4[4];
									String subcalles14S = aZona4[5];
									String aSubcalles14[] = descomposeT(
											subcalles14S, "/");
									idSubcalle14 = aSubcalles14[0];
									orientacion14 = aSubcalles14[1];
									numeroEspacios14=aSubcalles14[2];
									callePrincipal14 = aSubcalles14[3];
									calleSecundaria114 = aSubcalles14[4];
									calleSecundaria214 = aSubcalles14[5];
									manejador.abrirBaseDatos();
									int num4 = aZona4.length - 5;
									bienHecho = manejador
											.insertarAsignacionZona4(
													// /ver otra zona 4
													nombreUsuarioServ,
													nombreZona4, idSubcalle14,
													callePrincipal14,
													calleSecundaria114,
													calleSecundaria214, num4,
													horaInicio4, horaFin4,
													orientacion14,
													horaInicioReceso4,
													horaFinReceso4,numeroEspacios14);
									manejador.close();
									if (aZona4.length >= 7) {
										String subcalles24S = aZona4[6];
										String aSubcalles24[] = descomposeT(
												subcalles24S, "/");
										idSubcalle24 = aSubcalles24[0];
										orientacion24 = aSubcalles24[1];
										numeroEspacios24=aSubcalles24[2];
										callePrincipal24 = aSubcalles24[3];
										calleSecundaria124 = aSubcalles24[4];
										calleSecundaria224 = aSubcalles24[5];
										manejador.abrirBaseDatos();
										bienHecho = manejador
												.insertarAsignacionZonaSubcalle42(
														id, idSubcalle24,
														callePrincipal24,
														calleSecundaria124,
														calleSecundaria224,
														orientacion24,numeroEspacios24);
										manejador.close();
										if (aZona4.length >= 8) {
											String subcalles34S = aZona4[7];
											String aSubcalles34[] = descomposeT(
													subcalles34S, "/");
											idSubcalle34 = aSubcalles34[0];
											orientacion34 = aSubcalles34[1];
											numeroEspacios34=aSubcalles34[2];
											callePrincipal34 = aSubcalles34[3];
											calleSecundaria134 = aSubcalles34[4];
											calleSecundaria234 = aSubcalles34[5];
											manejador.abrirBaseDatos();
											bienHecho = manejador
													.insertarAsignacionZonaSubcalle43(
															id, idSubcalle34,

															callePrincipal34,
															calleSecundaria134,
															calleSecundaria234,
															orientacion34,numeroEspacios34);
											manejador.close();
											System.out.println("id dubcallle34"
													+ idSubcalle34
													+ "calle principal "
													+ callePrincipal34
													+ "calle secundaria 1"
													+ calleSecundaria134
													+ "calle secundaria 2 "
													+ calleSecundaria234);
											if (aZona4.length >= 9) {
												String subcalles44S = aZona4[8];
												String aSubcalles44[] = descomposeT(
														subcalles44S, "/");
												idSubcalle44 = aSubcalles44[0];
												orientacion44 = aSubcalles44[1];
												numeroEspacios44=aSubcalles44[2];
												callePrincipal44 = aSubcalles44[3];
												calleSecundaria144 = aSubcalles44[4];
												calleSecundaria244 = aSubcalles44[5];
												// subcalle 4 de la ZonaTrabajo1
												// 4 persistir
												manejador.abrirBaseDatos();
												bienHecho = manejador
														.insertarAsignacionZonaSubcalle44(
																id,
																idSubcalle44,
																callePrincipal44,
																calleSecundaria144,
																calleSecundaria244,
																orientacion44,numeroEspacios44);
												manejador.close();
												if (aZona4.length > 9) {
													String subcalles54S = aZona4[9];
													String aSubcalles54[] = descomposeT(
															subcalles54S, "/");
													idSubcalle54 = aSubcalles54[0];
													orientacion54 = aSubcalles54[1];
													numeroEspacios54=aSubcalles54[2];
													callePrincipal54 = aSubcalles54[3];
													calleSecundaria154 = aSubcalles54[4];
													calleSecundaria254 = aSubcalles54[5];
													// subcalle 5 de la
													// ZonaTrabajo1 4 persistir
													manejador.abrirBaseDatos();
													bienHecho = manejador
															.insertarAsignacionZonaSubcalle45(
																	id,
																	idSubcalle54,
																	callePrincipal54,
																	calleSecundaria154,
																	calleSecundaria254,
																	orientacion54,numeroEspacios54);
													manejador.close();
												}
											}
										}
									}
								}
							}
						}
						String multas = datosExtraidos[5];
						String multasS = multas.substring(1,
								multas.length() - 1);

						String vectorMultas[] = descomposeT(multasS, ",");
						ArrayList<String> multasLista = new ArrayList<String>();
						for (int i = 0; i < vectorMultas.length; i++) {
							multasLista.add(vectorMultas[i]);
						}
						ArrayList<String> multasOrde = new ArrayList<String>();
						multasOrde.addAll(ordenarMultasPorTiempo(multasLista));
						manejador.abrirBaseDatos();
						for (int c = 0; c < multasOrde.size(); c++) {
							String multaP = multasOrde.get(c);
							String multaPosicion[] = descomposeT(multaP, "-");
							idTipoMultaServidor = multaPosicion[0];
							razonMulta = multaPosicion[1];
							montoMulta = multaPosicion[2];
							desdeTiempoMulta = multaPosicion[3];
							int desdeTiempo = Integer
									.parseInt(desdeTiempoMulta);
							hastaTiempoMulta = multaPosicion[4];
							int hastaTiempo = Integer
									.parseInt(hastaTiempoMulta);
							tiempo = (hastaTiempo - desdeTiempo) + 1;
							bienHecho = manejador.insertarMultas(
									idTipoMultaServidor, razonMulta,
									montoMulta, desdeTiempoMulta,
									hastaTiempoMulta, tiempo);
						}

						manejador.close();

					} catch (Exception e) {
						// TODO Auto-generated catch block
						bienHecho = false;
						e.printStackTrace();
					}
					if (!bienHecho) {
						Toast.makeText(getBaseContext(),
								"La Datos no fueron Cargados",
								Toast.LENGTH_LONG).show();
					}

					Intent aLocalizacion = new Intent(InicioSesion.this,
							Localizacion.class);
					String irAZona = "Ir a zona";
					aLocalizacion.putExtra("IrZona", irAZona);
					startActivity(aLocalizacion);

				} else {
					if (datosExtraidos[2].compareTo("2") == 0) {
						Toast.makeText(getBaseContext(),
								"No tiene zonas de trabajo asignadas",
								Toast.LENGTH_LONG).show();
						dialogCircle.cancel();
						dialogoZonasNoAsignadas();
					} else {
						if (datosExtraidos[2].compareTo("3") == 0) {
							dialogCircle.cancel();
							dialogoSesionIniciada();

						} else {
							dialogCircle.cancel();
							dialogoUsuarioContrasenaIncorrecta();
						}
					}
				}
			}

		} else {

			dialogoErrorAlEntrar();

		}

	}
	public boolean conectar() {
		try {
			GestorBaseDatos crear = new GestorBaseDatos(null);
			crear.abrirBaseDatos();
			ip = crear.obtenerIp();
			String x = "";
			x = crear.obtenerPuerto();
			puerto = Integer.parseInt(x);
			crear.close();
		} catch (Exception e) {
			// TODO: handle exception

		}

		try {
			sk = new Socket(ip, puerto);
			if (sk.isConnected() == true) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();

			return false;
		}

	}
	
	public void enviarMensaje(String mensaje) {
		try {
			salida = new DataOutputStream(new BufferedOutputStream(
					sk.getOutputStream()));
			salida.writeUTF(mensaje);
			salida.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String recibirMensaje() {
		String mensajeRecibido = "";
		try {
			entrada = new DataInputStream(new BufferedInputStream(
					sk.getInputStream()));
			mensajeRecibido = getEntrada().readUTF();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return mensajeRecibido;
	}
	public String quitarEspaciosTrama(String tramaCadena) {
		String tramaSinEspacios = "";
		for (int i = 0; i < tramaCadena.length(); i++) {
			char c = tramaCadena.charAt(i);
			tramaSinEspacios = tramaSinEspacios + String.valueOf(c);
			if (c == ' ') {
				char c1 = tramaCadena.charAt(i - 1);
				if (c1 == ',') {
					tramaSinEspacios = tramaSinEspacios.substring(0,
							tramaSinEspacios.length() - 1);
				}
			}
		}
		return tramaSinEspacios;
	}
	
/**
 * Ordena las zonas de trabajo por horario. 
 * @param zonasDeControl zonas a ordenar.
 * @return String[] zonasOrdenadas 
 */
	private String[] ordenarZonas(String zonasDeControl[]) {
		String zonasOrdenadas[] = new String[zonasDeControl.length];
		int horarios[] = new int[zonasDeControl.length];
		String horaZona = "";
		String zonaPosicionS = "";
		String zonaPosicionSS = "";
		String zonaPosicion[];
		if (zonasDeControl.length == 1) {
			zonasOrdenadas = zonasDeControl;
		} else {
			for (int i = 0; i < zonasDeControl.length; i++) {
				zonaPosicionS = zonasDeControl[i];
				zonaPosicionSS = zonaPosicionS.substring(1);
				zonaPosicion = descomposeTrama(zonaPosicionSS, ",");
				int horaI = Integer.parseInt(zonaPosicion[1].substring(0, 2));
				System.out.println(horaI + "descomposicionHoraInicio");
				horaZona = String.valueOf(horaI).concat(String.valueOf(i));
				horarios[i] = Integer.parseInt(horaZona);
			}

			int h, j, menor, pos, tmp;
			for (h = 0; h < horarios.length - 1; h++) {
				menor = horarios[h];
				pos = h;
				for (j = h + 1; j < horarios.length; j++) {
					if (horarios[j] < menor) {
						menor = horarios[j];
						pos = j;
					}
				}
				if (pos != h) {
					tmp = horarios[h];
					horarios[h] = horarios[pos];
					horarios[pos] = tmp;
				}
			}
			for (int k = 0; k < horarios.length; k++) {
				String horarioC = String.valueOf(horarios[k]);
				String descomposicion = horarioC
						.substring(horarioC.length() - 1);
				int posicion = Integer.parseInt(descomposicion);
				zonasOrdenadas[k] = zonasDeControl[posicion];
			}
		}

		return zonasOrdenadas;
	}
/**
 * Ordena la multas por intervalos de tiempo
 * @param multas
 * @return ArrayList<String> devuelve las multas ordenadas
 */
	private ArrayList<String> ordenarMultasPorTiempo(ArrayList<String> multas) {
		ArrayList<String> multasOrdenadas = new ArrayList<String>();
		ArrayList<Integer> tiempoDesdeMultas = new ArrayList<Integer>();
		// String tiempoDesde = "";
		String multasString = "";
		String multasPosicion[];
		ArrayList<String> multasNoDesde = new ArrayList<String>();
		if (multas.size() == 1) {
			multasOrdenadas.addAll(multas);
		} else {
			for (int i = 0; i < multas.size(); i++) {
				multasString = multas.get(i);
				multasPosicion = descomposeTrama(multasString, "-");
				int tiempoDesde = Integer.parseInt(multasPosicion[3]);
				if (tiempoDesde != 0) {
					tiempoDesdeMultas.add(tiempoDesde);
				} else {
					multasNoDesde.add(multasString);
				}
			}
			int tiempoDesdeMulta[] = new int[tiempoDesdeMultas.size()];
			for (int j = 0; j < tiempoDesdeMultas.size(); j++) {
				tiempoDesdeMulta[j] = tiempoDesdeMultas.get(j);
			}

			int h, j, menor, pos, tmp;
			for (h = 0; h < tiempoDesdeMulta.length - 1; h++) {
				menor = tiempoDesdeMulta[h];
				pos = h;
				for (j = h + 1; j < tiempoDesdeMulta.length; j++) {
					if (tiempoDesdeMulta[j] < menor) {
						menor = tiempoDesdeMulta[j];
						pos = j;
					}
				}
				if (pos != h) {
					tmp = tiempoDesdeMulta[h];
					tiempoDesdeMulta[h] = tiempoDesdeMulta[pos];
					tiempoDesdeMulta[pos] = tmp;
				}
			}

			for (int k = 0; k < tiempoDesdeMulta.length; k++) {
				int elemento = tiempoDesdeMulta[k];
				for (int l = 0; l < multas.size(); l++) {
					multasString = multas.get(l);
					multasPosicion = descomposeTrama(multasString, "-");
					int tiempoDesde = Integer.parseInt(multasPosicion[3]);
					if (elemento == tiempoDesde) {
						multasOrdenadas.add(multasString);
					}
				}
			}
			multasOrdenadas.addAll(multasNoDesde);
			for (int i = 0; i < multasOrdenadas.size(); i++) {

				System.out.println(multasOrdenadas.get(i));
			}
		}
		return multasOrdenadas;
	}

	public String[] descomposeTrama(String trama, String separador) {
		String[] subtramas = trama.split(separador);
		return subtramas;
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		try {
			sk.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public String[] descomposeT(String trama, String separador) {
		String[] elementos = trama.split(separador);
		return elementos;
	}
	/**
	 * Muestra un diálogo de espera
	 */
	public void dialogEspera() {
		dialogCircle = new ProgressDialog(InicioSesion.this);
		dialogCircle.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		dialogCircle.setMessage("Procesando...");
		dialogCircle.setCancelable(true);
		dialogCircle.setMax(100);
		dialogCircle.show();
	}



	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		try {
			dialogCircle.cancel();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	/**
	 * Muestra un diálogo de información cuando la conexión con la red ha fallado
	 * @return Diálogo de información
	 */
	private Dialog dialogoErrorAlEntrar() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage(
				"La conexión con el servidor de SOFTCOV ha fallado. Revisa la conexión de red o vuelve a intentarlo más tarde.")
				.setTitle("Error al entrar")
				.setIcon(R.drawable.ic_11_alerts_and_states_warning)
				.setPositiveButton("Aceptar",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								dialog.cancel();

							}
						});
		// return builder.create();
		AlertDialog alert = builder.create();
		alert.show();
		//dialogCircle.cancel();
		return alert;
	}
	/**
	 * Muestra un diálogo de información cuando la contraseña ingresada es incorrecta
	 * @return Diálogo de información
	 */
	private Dialog dialogoUsuarioContrasenaIncorrecta() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage(
				"El Usuario o contraseña que has proporcionado no es correcta. Por favor vuelve a intentarlo")
				.setTitle("Usuario o contraseña incorrecta")
				.setIcon(R.drawable.ic_11_alerts_and_states_warning)
				.setPositiveButton("Aceptar",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								dialog.cancel();
							}
						});
		// return builder.create();
		AlertDialog alert = builder.create();
		alert.show();
		// dialogCircle.cancel();
		return alert;
	}
	/**
	 * Muestra un diálogo de información cuando la sesión del usuario esta en uso
	 * @return Diálogo de información
	 */
	private Dialog dialogoSesionIniciada() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage(
				"El Usuario ya tiene una Sesión Iniciada. Por favor comuníquese con el administrador del sistema.")
				.setTitle("Sesión Iniciada")
				.setIcon(R.drawable.ic_11_alerts_and_states_warning)
				.setPositiveButton("Aceptar",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								dialog.cancel();
							}
						});
		AlertDialog alert = builder.create();
		alert.show();
		dialogCircle.cancel();
		return alert;
	}
	/**
	 * Muestra un diálogo de información cuando no existen zonas asignadas al controlador
	 * @return Diálogo de información
	 */
	private Dialog dialogoZonasNoAsignadas() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage(
				"Usted Actualmente no tiene zonas asignadas. Vuelva a intentarlo más tarde")
				.setTitle("Zonas no asignadas")
				.setIcon(R.drawable.ic_11_alerts_and_states_warning)
				.setPositiveButton("Aceptar",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								dialog.cancel();
							}
						});
		// return builder.create();
		AlertDialog alert = builder.create();
		alert.show();
		//dialogCircle.cancel();
		return alert;
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		try {
			if (keyCode == KeyEvent.KEYCODE_BACK) {
				moveTaskToBack(true);
				return true;
			}
		} catch (Exception e) {
			// TODO: handle exception
			Toast.makeText(getBaseContext(), "Error al ir Atrás" + e,
					Toast.LENGTH_LONG).show();
		}

		return super.onKeyDown(keyCode, event);
	}

	
	public static String encriptacion(String cadena, String clave) {
		StandardPBEStringEncryptor s = new StandardPBEStringEncryptor();
		s.setPassword(clave);
		return s.encrypt(cadena);
	}

	public static String desencriptacion(String cadena, String clave) {
		StandardPBEStringEncryptor s = new StandardPBEStringEncryptor();
		s.setPassword(clave);
		String devuelve = "";
		try {
			devuelve = s.decrypt(cadena);
		} catch (Exception e) {
		}
		return devuelve;
	}
/**
 * Guarda la ip y puerto en el archivo de configuración
 */
	public void guardarIpPuerto() {
		try {
			File root = Environment.getExternalStorageDirectory();
			File dir = new File(root + "/Android/data");
			File f = new File(dir.getAbsolutePath(), "configTCP.txt");

			BufferedReader fin = new BufferedReader(new InputStreamReader(
					new FileInputStream(f)));

			String texto = fin.readLine();
			fin.close();
			String[] datosConexion = descomposeT(texto, ":");
			String ip = datosConexion[0];
			String port = datosConexion[1];
			int puerto = Integer.parseInt(port);
			try {
				guardarConexion(ip, puerto);
			} catch (Exception e) {
				System.out.println("error conexion ingreso");
			}
			System.out.println("texto encontrado " + texto);
		} catch (Exception ex) {
			Log.e("Ficheros", "Error al leer fichero desde tarjeta SD");
		}
	}
	/**
	 * Guarda la ip y puerto para establecer la conexión con el servidor
	 * @param ip Ip del servidor
	 * @param puerto Puerto de conexión
	 */

	public void guardarConexion(String ip, int puerto) {
		GestorBaseDatos manejador = new GestorBaseDatos(InicioSesion.this);
		boolean bienHecho2 = false;
		try {

			manejador.abrirBaseDatos();
			bienHecho2 = manejador.insertarIpPuerto(ip, puerto,obtenerMac());
			manejador.close();
		} catch (Exception e) {
			System.out.println("se se guardo");

		}
		if (!bienHecho2) {
			System.out.println("La Datos no fueron Cargados de IP y PUERTO");

		}
		if (bienHecho2) {
			System.out.println("La Datos fueron Cargados de IP y PUERTO");
		}

	}

	@Override
	public void onClick(View view) {
		if (view.equals(botonInicioSesion)) {
			// TODO Auto-generated method stub
			String estado = " ";
			GestorBaseDatos sesion = new GestorBaseDatos(InicioSesion.this);
			try {
				sesion.crearDataBase();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			sesion.abrirBaseDatos();
			estado = sesion.consultarEstadoSesion();
			sesion.close();
			if (estado.compareTo("1") == 0) {
				user = cajaUsuario.getText().toString().trim();
				password = cajaContrasena.getText().toString();
				GestorBaseDatos sesion2 = new GestorBaseDatos(InicioSesion.this);
				sesion2.abrirBaseDatos();
				String datoUsuario = sesion2.consultarUsuarioSesion();
				String datoContrasena = sesion2.consultarContrasena();
				sesion2.close();
				if (user.compareTo(datoUsuario) == 0
						&& password.compareTo(datoContrasena) == 0) {
					Intent aZonaC = new Intent(InicioSesion.this,
							ZonasControl.class);
					startActivity(aZonaC);
				}
				if (estado.compareTo("null") == 0) {
					guardarIpPuerto();
					inicializacion();
					// dilogUsuarioContrase??aIncorecta();
				}
			} else {
				guardarIpPuerto();
				inicializacion();
			}
		}
	}
}
